Wednesday, June 10, 2020

Query to list Unindexed Foreign Keys



Query to get Unindexed Foreign Keys 


undefine schema_owner
set pagesize 5000
set linesize 350
column status format a10
column table_name format a30
column fk_name format a30
column fk_columns format a30
column index_name format a30
column index_columns format a30


select
      case
        when i.index_name is not null then
          'indexed'
        else
          'unindexed'
       end                  as status
      ,c.table_name         as table_name
      ,c.constraint_name    as fk_name
      ,c.fk_columns         as fk_columns
      ,i.index_name         as index_name
      ,i.index_columns      as index_columns
from
    (
      select  a.table_name
             ,a.constraint_name
             ,listagg(b.column_name, ' ' )
              within group (order by column_name) as fk_columns
      from
              dba_constraints a
             ,dba_cons_columns b
      where
              a.constraint_name = b.constraint_name
      and     a.constraint_type = 'R'
      and     a.owner           = b.owner
      and     a.owner           = '&&schema_owner'
      group by
              a.table_name
             ,a.constraint_name
    ) c
left outer join
  (
    select  table_name
           ,index_name
           ,cr
           ,listagg(column_name, ' ')
            within group (order by column_name) as index_columns
    from
        (
          select
                  table_name
                 ,index_name
                 ,column_position
                 ,column_name
                 ,connect_by_root(column_name) cr
          from
                  dba_ind_columns
          where
                  index_owner               = '&&schema_owner'
          connect
                 by prior column_position-1 = column_position
                 and prior index_name       = index_name
         )
    group by table_name
            ,index_name, cr
  ) i
      on c.fk_columns = i.index_columns
     and c.table_name = i.table_name;





SQL> undefine schema_owner
set pagesize 5000
set linesize 350
column status format a10
column table_name format a30
column fk_name format a30
SQL> SQL> SQL> SQL> SQL> SQL> column fk_columns format a30
column index_name format a30
column index_columns format a30


select
SQL> SQL> SQL> SQL> SQL>   2        case
        when i.index_name is not null then
          'indexed'
        else
          'unindexed'
       end                  as status
  3    4    5    6    7    8        ,c.table_name         as table_name
      ,c.constraint_name    as fk_name
      ,c.fk_columns         as fk_columns
      ,i.index_name         as index_name
      ,i.index_columns      as index_columns
  9   10   11   12   13  from
    (
      select  a.table_name
             ,a.constraint_name
             ,listagg(b.column_name, ' ' )
 14   15   16   17   18                within group (order by column_name) as fk_columns
      from
              dba_constraints a
 19   20   21               ,dba_cons_columns b
      where
              a.constraint_name = b.constraint_name
      and     a.constraint_type = 'R'
 22   23   24   25        and     a.owner           = b.owner
      and     a.owner           = '&&schema_owner'
 26   27        group by
 28                a.table_name
             ,a.constraint_name
    ) c
 29   30   31  left outer join
  (
    select  table_name
           ,index_name
           ,cr
 32   33   34   35   36             ,listagg(column_name, ' ')
            within group (order by column_name) as index_columns
    from
 37   38   39          (
 40            select
                  table_name
                 ,index_name
                 ,column_position
                 ,column_name
                 ,connect_by_root(column_name) cr
          from
 41   42   43   44   45   46   47                    dba_ind_columns
          where
                  index_owner               = '&&schema_owner'
          connect
                 by prior column_position-1 = column_position
                 and prior index_name       = index_name
 48           )
    group by table_name
            ,index_name, cr
 49   50   51   52   53   54   55   56    ) i
      on c.fk_columns = i.index_columns
     and c.table_name = i.table_name; 57   58
Enter value for schema_owner: HR
old  26:       and     a.owner           = '&&schema_owner'
new  26:       and     a.owner           = 'HR'
old  49:                   index_owner               = '&&schema_owner'
new  49:                   index_owner               = 'HR'

STATUS     TABLE_NAME                     FK_NAME                        FK_COLUMNS                     INDEX_NAME                     IN                       DEX_COLUMNS
---------- ------------------------------ ---------------  ------- ------------------------------ ----------------       ---------------        --------------                    
indexed    EMPLOYEES                      EMP_JOB_FK                     JOB_ID                         EMP_JOB_IX                     JO                       B_ID
indexed    EMPLOYEES                      EMP_MANAGER_FK                 MANAGER_ID                     EMP_MANAGER_IX                 MA                       NAGER_ID
indexed    EMPLOYEES                      EMP_DEPT_FK                    DEPARTMENT_ID                  EMP_DEPARTMENT_IX              DE                       PARTMENT_ID
indexed    LOCATIONS                      LOC_C_ID_FK                    COUNTRY_ID                     LOC_COUNTRY_IX                 CO                       UNTRY_ID
indexed    DEPARTMENTS                    DEPT_LOC_FK                    LOCATION_ID                    DEPT_LOCATION_IX               LO                       CATION_ID
indexed    JOB_HISTORY                    JHIST_JOB_FK                   JOB_ID                         JHIST_JOB_IX                   JO                       B_ID
indexed    JOB_HISTORY                    JHIST_EMP_FK                   EMPLOYEE_ID                    JHIST_EMPLOYEE_IX              EM                       PLOYEE_ID
indexed    JOB_HISTORY                    JHIST_DEPT_FK                  DEPARTMENT_ID                  JHIST_DEPARTMENT_IX            DE                       PARTMENT_ID
indexed    JOB_HISTORY                    JHIST_EMP_FK                   EMPLOYEE_ID                    JHIST_EMP_ID_ST_DATE_PK        EM                       PLOYEE_ID
unindexed  DEPARTMENTS                    DEPT_MGR_FK                    MANAGER_ID
unindexed  COUNTRIES                      COUNTR_REG_FK                  REGION_ID

11 rows selected.

SQL>

Tuesday, June 9, 2020

Import data in AWS Oracle RDS using datapump API




Import data in AWS Oracle RDS




copy dumpfile to s3 

[oracle@anurag dpdump]$
[oracle@anurag dpdump]$ pwd
/u01/oracle/admin/india/dpdump
[oracle@anurag dpdump]$
[oracle@anurag dpdump]$ aws s3 cp /u01/oracle/admin/india/dpdump/EXPDAT01-13_50_36.DMP s3://demodatapump
upload: ./EXPDAT01-13_50_36.DMP to s3://demodatapump/EXPDAT01-13_50_36.DMP
[oracle@anurag dpdump]$



download dumpfile from S3 to RDS instance


SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
p_bucket_name    =>  'demodatapump',  
p_directory_name =>  'DATA_PUMP_DIR')
AS TASK_ID FROM DUAL ;

1591366708566-339

check progress using log

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1591366708566-339.log'));



SQL> SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3(
p_bucket_name    =>  'demodatapump',
p_directory_name =>  'DATA_PUMP_DIR')
AS TASK_ID FROM DUAL ;  2    3    4

TASK_ID
--------------------------------------------------------------------------------
1591366708566-339

SQL>
SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1591366708566-339.log'));

TEXT
--------------------------------------------------------------------------------
2020-06-05 14:18:30.436 UTC [INFO ] This task is about to list the Amazon S3 obj
ects for AWS Region us-west-1, bucket name demodatapump, and prefix .

2020-06-05 14:18:30.519 UTC [INFO ] The task successfully listed the Amazon S3 o
bjects for AWS Region us-west-1, bucket name demodatapump, and prefix .

2020-06-05 14:18:30.536 UTC [INFO ] This task is about to download the Amazon S3
 object or objects in /rdsdbdata/datapump from bucket name demodatapump and key
EXPDAT01-13_50_36.DMP.

2020-06-05 14:18:30.745 UTC [INFO ] The task successfully downloaded the Amazon

TEXT
--------------------------------------------------------------------------------
S3 object or objects from bucket name demodatapump with key EXPDAT01-13_50_36.DM
P to the location /rdsdbdata/datapump.

2020-06-05 14:18:30.745 UTC [INFO ] The task finished successfully.

SQL>


check list of directory 

SQL> select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) order by mtime;

FILENAME                       TYPE         FILESIZE MTIME
------------------------------ ---------- ---------- ---------
sample_copied.dmp              file           352256 29-MAY-20
sample_imp.log                 file              835 29-MAY-20
test_schema.dmp                file           352256 29-MAY-20
datapump/                      directory        4096 05-JUN-20
EXPDAT01-13_50_36.DMP          file           724992 05-JUN-20

SQL>


import  HR schema


DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'EXPDAT01-13_50_36.DMP', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'impdp_hr_schema.log', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''HR'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/




SQL> DECLARE
hdnl NUMBER;
BEGIN
hdnl := DBMS_DATAPUMP.OPEN( operation => 'IMPORT', job_mode => 'SCHEMA', job_name=>null);
  2    3    4    5  DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'EXPDAT01-13_50_36.DMP', directory => 'DATA_PUMP_DIR', filetype => dbms_datapump.ku$_file_type_dump_file);
DBMS_DATAPUMP.ADD_FILE( handle => hdnl, filename => 'impdp_hr_schema.log', directory => 'DATA_P  6  UMP_DIR', filetype => dbms_datapump.ku$_file_type_log_file);
DBMS_DATAPUMP.METADATA_FILTER(hdnl,'SCHEMA_EXPR','IN (''HR'')');
DBMS_DATAPUMP.START_JOB(hdnl);
END;
/  7    8    9   10

PL/SQL procedure successfully completed.

SQL>
SQL>



check import log 


SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR','impdp_hr_schema.log'))


SQL> SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('DATA_PUMP_DIR','impdp_hr_schema.log'));

TEXT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Master table "ADMIN"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "ADMIN"."SYS_IMPORT_SCHEMA_01":
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HR"."EMPLOYEES"                            17.08 KB     107 rows
. . imported "HR"."LOCATIONS"                            8.437 KB      23 rows
. . imported "HR"."JOB_HISTORY"                          7.195 KB      10 rows
. . imported "HR"."JOBS"                                 7.109 KB      19 rows
. . imported "HR"."DEPARTMENTS"                          7.125 KB      27 rows
. . imported "HR"."COUNTRIES"                            6.367 KB      25 rows
. . imported "HR"."REGIONS"                              5.546 KB       4 rows
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "ADMIN"."SYS_IMPORT_SCHEMA_01" successfully completed at Fri Jun 5 14:22:36 2020 elapsed 0 00:00:19

30 rows selected.

SQL>

validate schema after import done
SQL> select owner,object_name ,object_type ,status from dba_objects where owner='HR';

OWNER                OBJECT_NAME                              OBJECT_TYPE             STATUS
-------------------- ---------------------------------------- ----------------------- ----------
HR                   DEPARTMENTS_SEQ                          SEQUENCE                VALID
HR                   EMPLOYEES_SEQ                            SEQUENCE                VALID
HR                   LOCATIONS_SEQ                            SEQUENCE                VALID
HR                   COUNTRIES                                TABLE                   VALID
HR                   COUNTRY_C_ID_PK                          INDEX                   VALID
HR                   DEPARTMENTS                              TABLE                   VALID
HR                   EMPLOYEES                                TABLE                   VALID
HR                   LOCATIONS                                TABLE                   VALID
HR                   REGIONS                                  TABLE                   VALID
HR                   JOBS                                     TABLE                   VALID
HR                   JOB_HISTORY                              TABLE                   VALID
HR                   SECURE_DML                               PROCEDURE               VALID
HR                   ADD_JOB_HISTORY                          PROCEDURE               VALID
HR                   EMP_DETAILS_VIEW                         VIEW                    VALID
HR                   DEPT_LOCATION_IX                         INDEX                   VALID
HR                   DEPT_ID_PK                               INDEX                   VALID
HR                   EMP_JOB_IX                               INDEX                   VALID
HR                   EMP_DEPARTMENT_IX                        INDEX                   VALID
HR                   EMP_MANAGER_IX                           INDEX                   VALID
HR                   EMP_EMP_ID_PK                            INDEX                   VALID
HR                   EMP_NAME_IX                              INDEX                   VALID
HR                   LOC_ID_PK                                INDEX                   VALID
HR                   LOC_COUNTRY_IX                           INDEX                   VALID
HR                   LOC_STATE_PROVINCE_IX                    INDEX                   VALID
HR                   LOC_CITY_IX                              INDEX                   VALID
HR                   REG_ID_PK                                INDEX                   VALID
HR                   JOB_ID_PK                                INDEX                   VALID
HR                   JHIST_EMP_ID_ST_DATE_PK                  INDEX                   VALID
HR                   JHIST_EMPLOYEE_IX                        INDEX                   VALID
HR                   JHIST_DEPARTMENT_IX                      INDEX                   VALID
HR                   JHIST_JOB_IX                             INDEX                   VALID
HR                   EMP_EMAIL_UK                             INDEX                   VALID
HR                   SECURE_EMPLOYEES                         TRIGGER                 VALID
HR                   UPDATE_JOB_HISTORY                       TRIGGER                 VALID

34 rows selected.


upload in S3

SELECT rdsadmin.rdsadmin_s3_tasks.upload_to_s3(
      p_bucket_name    =>  'demodatapump',       
      p_directory_name =>  'DATA_PUMP_DIR') 
   AS TASK_ID FROM DUAL;
   

check alert log in RDS

SELECT text FROM table(rdsadmin.rds_file_util.read_text_file('BDUMP','alert_ORCL.log'));

Friday, June 5, 2020

How to install AWC CLI on Linux

Install  AWC CLI on Linux 


[root@anurag ~]#
[root@anurag ~]#
[root@anurag ~]# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 31.4M  100 31.4M    0     0  71.7M      0 --:--:-- --:--:-- --:--:-- 71.7M
[root@anurag ~]# ls -lrt
total 33960
-rw-------. 1 root root     7325 Jun 18  2019 original-ks.cfg
-rw-------. 1 root root     7539 Jun 18  2019 anaconda-ks.cfg
-rw-r--r--  1 root root  1807342 Apr 14 11:16 get-pip.py
-rw-r--r--  1 root root 32945325 Jun  5 13:55 awscliv2.zip
[root@anurag ~]#
[root@anurag ~]# unzip awscliv2.zip
Archive:  awscliv2.zip
   creating: aws/
   creating: aws/dist/
  inflating: aws/THIRD_PARTY_LICENSES
  inflating: aws/install
  inflating: aws/README.md
   creating: aws/dist/_struct/
...............................
...............................
................................

  inflating: aws/dist/cryptography-2.8-py3.7.egg-info/top_level.txt
  inflating: aws/dist/cryptography-2.8-py3.7.egg-info/METADATA
  inflating: aws/dist/cryptography-2.8-py3.7.egg-info/LICENSE.APACHE
  inflating: aws/dist/cryptography-2.8-py3.7.egg-info/INSTALLER
  inflating: aws/dist/cryptography-2.8-py3.7.egg-info/WHEEL
[root@anurag ~]#
[root@anurag ~]#
[root@anurag ~]#
[root@anurag ~]# ls -lrt
total 33960
-rw-------. 1 root root     7325 Jun 18  2019 original-ks.cfg
-rw-------. 1 root root     7539 Jun 18  2019 anaconda-ks.cfg
-rw-r--r--  1 root root  1807342 Apr 14 11:16 get-pip.py
drwxr-xr-x  3 root root       78 Jun  4 22:49 aws
-rw-r--r--  1 root root 32945325 Jun  5 13:55 awscliv2.zip
[root@anurag ~]#
[root@anurag ~]#
[root@anurag ~]# ./aws/install
You can now run: /usr/local/bin/aws --version
[root@anurag ~]#
[root@anurag ~]#
[root@anurag ~]#
[root@anurag ~]# which aws
/usr/local/bin/aws
[root@anurag ~]#
[root@anurag ~]#


[root@anurag ~]# aws --version
aws-cli/2.0.19 Python/3.7.3 Linux/4.18.0-80.4.2.el8_0.x86_64 botocore/2.0.0dev23
[root@anurag ~]#


https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html

Monday, June 1, 2020

Installed Oracle RAC 12.2.0.1.0 on Linux 7.5

RAC Intro


Storage: openfiler
OS: Linux 7.5 
Database : 12.2.0.1
CPU: 2 core per node
RAM: 8 GB
Hypervisor: Virtual Box

Node1 : racnode1
Node2 : racnode2


[root@racnode1 bin]# ./olsnodes -n -i -s -t
racnode1        1       racnode1-vip.localdomain        Active  Unpinned
racnode2        2       racnode2-vip.localdomain        Active  Unpinned

[root@racnode1 bin]#

[oracle@racnode2 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

#public IP
192.168.43.222  racnode1.localdomain racnode1
192.168.43.87   racnode2.localdomain racnode2


#private ip
192.168.10.88  racnode1-priv.localdomain racnode1-priv
192.168.10.89  racnode2-priv.localdomain racnode2-priv

#virtul ip

192.168.43.224  racnode1-vip.localdomain racnode1-vip
192.168.43.225  racnode2-vip.localdomain racnode2-vip

# SCAN
192.168.43.228  racnode-scan.localdomain racnode1-scan
[oracle@racnode2 ~]$



[root@racnode2 bin]# ./crsctl check cluster
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
[root@racnode2 bin]#
[root@racnode2 bin]# ./crsctl check cluster -all
**************************************************************
racnode1:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
racnode2:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
[root@racnode2 bin]# date
Sun May 31 12:23:15 IST 2020
[root@racnode2 bin]#

[oracle@racnode1 ~]$ . grid_env
[oracle@racnode1 ~]$
[oracle@racnode1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr
               ONLINE  ONLINE       racnode1                 STABLE
               ONLINE  ONLINE       racnode2                 STABLE
ora.DATA.dg
               ONLINE  ONLINE       racnode1                 STABLE
               ONLINE  ONLINE       racnode2                 STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       racnode1                 STABLE
               ONLINE  ONLINE       racnode2                 STABLE
ora.chad
               ONLINE  ONLINE       racnode1                 STABLE
               ONLINE  ONLINE       racnode2                 STABLE
ora.net1.network
               ONLINE  ONLINE       racnode1                 STABLE
               ONLINE  ONLINE       racnode2                 STABLE
ora.ons
               ONLINE  ONLINE       racnode1                 STABLE
               ONLINE  ONLINE       racnode2                 STABLE
ora.proxy_advm
               OFFLINE OFFLINE      racnode1                 STABLE
               OFFLINE OFFLINE      racnode2                 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       racnode1                 STABLE
ora.MGMTLSNR
      1        ONLINE  ONLINE       racnode1                 169.254.30.165 192.1
                                                             68.10.88,STABLE
ora.asm
      1        ONLINE  ONLINE       racnode1                 Started,STABLE
      2        ONLINE  ONLINE       racnode2                 Started,STABLE
      3        OFFLINE OFFLINE                               STABLE
ora.cvu
      1        ONLINE  ONLINE       racnode1                 STABLE
ora.guggu.db
      1        ONLINE  ONLINE       racnode1                 Open,HOME=/u01/app/o
                                                             racle/product/12.2.0
                                                             .1/db_home,STABLE
      2        ONLINE  ONLINE       racnode2                 Open,HOME=/u01/app/o
                                                             racle/product/12.2.0
                                                             .1/db_home,STABLE
ora.mgmtdb
      1        ONLINE  ONLINE       racnode1                 Open,STABLE
ora.qosmserver
      1        ONLINE  ONLINE       racnode1                 STABLE
ora.racnode1.vip
      1        ONLINE  ONLINE       racnode1                 STABLE
ora.racnode2.vip
      1        ONLINE  ONLINE       racnode2                 STABLE
ora.scan1.vip
      1        ONLINE  ONLINE       racnode1                 STABLE
--------------------------------------------------------------------------------
[oracle@racnode1 ~]$



SQL> select INST_ID,INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STARTUP_TIME,STATUS from gv$instance;

   INST_ID INSTANCE_NUMBER INSTANCE_NAME    HOST_NAME                                                        VERSION           STARTUP_T STATUS
---------- --------------- ---------------- ---------------------------------------------------------------- ----------------- --------- ------------
         1               1 guggu1           racnode1.localdomain                                             12.2.0.1.0        31-MAY-20 OPEN
         2               2 guggu2           racnode2.localdomain                                             12.2.0.1.0        31-MAY-20 OPEN

SQL>